using System;
using System.Text;
using TccAg.VO;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace TccAg.DA
{
    public class SemestreDA
    {
        private String queryInsert = 
            @"INSERT INTO semestre
                ( 
                 GRADECURR, 
                 SEQUENCIA, 
                 ANO, 
                 PERIODO
                ) 
              VALUES
                ( 
                 @gradecurr, 
                 @sequencia, 
                 @ano, 
                 @periodo
                )";
        private String queryUpdate = 
            @"UPDATE semestre SET 
                gradecurr = @gradecurr, 
                sequencia = @sequencia, 
                ano = @ano, 
                periodo = @periodo 
              WHERE 
                ID = @id";
        private String queryDelete = "DELETE FROM semestre WHERE ID = @id";
        private String queryLoadAll = 
            @"SELECT  
                id, 
                gradecurr, 
                sequencia, 
                ano, 
                periodo 
              FROM 
                semestre";
        private String queryLoadByPk = 
            @"SELECT  
                id,     
                gradecurr, 
                sequencia, 
                ano, 
                periodo 
              FROM 
                semestre 
              WHERE 
                ID = @id";
        private String queryLoadByFk = 
            @"SELECT  
                id, 
                gradecurr, 
                sequencia, 
                ano, 
                periodo 
              FROM 
                semestre 
              WHERE 
                GRADECURR = @gradecurr";

        private String queryLoadByAnoPeriodo =
            @"SELECT  
                id, 
                gradecurr, 
                sequencia, 
                ano, 
                periodo 
              FROM 
                semestre 
              WHERE 
                ano = @ano
                AND
                periodo = @periodo";
        private String queryLoadByCurso =
           @"SELECT  
                id, 
                gradecurr, 
                sequencia, 
                ano, 
                periodo 
              FROM 
                semestre
              JOIN
                gradecurricular on (semestre.gradecurr = gradecurricular.id) 
              JOIN
                curso on (gradecurricular.curso = curso.id)
              WHERE 
                semestre.ano = @ano
                AND
                semestre.periodo = @periodo
                AND
                curso.id = @id";
        private SqlConnection conexao = new SqlConnection("Pegar conexão");

        //INSERIR 
        public int inserir(SemestreVO semestre)
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryInsert;

                if (semestre.Gradecurr != 0)
                        cmd.Parameters.Add(new SqlParameter("@gradecurr", (object) semestre.Gradecurr));
                else
                        cmd.Parameters.Add(new SqlParameter("@gradecurr", (object) DBNull.Value));

                if (semestre.Sequencia != 0)
                        cmd.Parameters.Add(new SqlParameter("@sequencia", (object) semestre.Sequencia));
                else
                        cmd.Parameters.Add(new SqlParameter("@sequencia", (object) DBNull.Value));

                if (semestre.Ano != 0)
                        cmd.Parameters.Add(new SqlParameter("@ano", (object) semestre.Ano));
                else
                        cmd.Parameters.Add(new SqlParameter("@ano", (object) DBNull.Value));

                if (semestre.Periodo != 0)
                        cmd.Parameters.Add(new SqlParameter("@periodo", (object) semestre.Periodo));
                else
                        cmd.Parameters.Add(new SqlParameter("@periodo", (object) DBNull.Value));

                conexao.Open();
                return cmd.ExecuteNonQuery();

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //ATUALIZAR 
        public int atualizar(SemestreVO semestre)
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                if (semestre.Id != 0)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)semestre.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryUpdate;

                if (semestre.Gradecurr != 0)
                        cmd.Parameters.Add(new SqlParameter("@gradecurr", (object) semestre.Gradecurr));
                else
                        cmd.Parameters.Add(new SqlParameter("@gradecurr", (object) DBNull.Value));
                if (semestre.Sequencia != 0)
                        cmd.Parameters.Add(new SqlParameter("@sequencia", (object) semestre.Sequencia));
                else
                        cmd.Parameters.Add(new SqlParameter("@sequencia", (object) DBNull.Value));
                if (semestre.Ano != 0)
                        cmd.Parameters.Add(new SqlParameter("@ano", (object) semestre.Ano));
                else
                        cmd.Parameters.Add(new SqlParameter("@ano", (object) DBNull.Value));
                if (semestre.Periodo != 0)
                        cmd.Parameters.Add(new SqlParameter("@periodo", (object) semestre.Periodo));
                else
                        cmd.Parameters.Add(new SqlParameter("@periodo", (object) DBNull.Value));
                conexao.Open();
                return cmd.ExecuteNonQuery();

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //EXCLUIR 
        public int excluir(SemestreVO semestre)
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryDelete;

                if (semestre.Id != 0)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)semestre.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                conexao.Open();
                return cmd.ExecuteNonQuery();

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //LOAD ALL 
        public List<SemestreVO> loadAll()
        {
            try
            {
                List<SemestreVO> objRetorno = new List<SemestreVO>();
                SemestreVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadAll;

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        objTemp = new SemestreVO();
                        if (dr["id"] != DBNull.Value)
                           objTemp.Id = (int)dr["id"];

                        if (dr["gradecurr"] != DBNull.Value)
                           objTemp.Gradecurr = (int)dr["gradecurr"];

                        if (dr["sequencia"] != DBNull.Value)
                           objTemp.Sequencia = (int)dr["sequencia"];

                        if (dr["ano"] != DBNull.Value)
                           objTemp.Ano = (int)dr["ano"];

                        if (dr["periodo"] != DBNull.Value)
                           objTemp.Periodo = (int)dr["periodo"];

                        objRetorno.Add(objTemp);
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //LOAD BY PK - Passa um objeto do tipo VO para em casos onde usar chave primária composta ter essas propriedades preenchidas
        public SemestreVO loadByPk(int Id)
        {
            SemestreVO objRetorno = null;
            objRetorno.Id = Id;
            return loadByPk(objRetorno);
        }

        //LOAD BY PK - Passa um objeto do tipo VO para em casos onde usar chave primária composta ter essas propriedades preenchidas
        public SemestreVO loadByPk(SemestreVO semestre)
        {
            try
            {
                SemestreVO objRetorno = null;
                SemestreVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                if (semestre.Id != 0)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)semestre.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadByPk;

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    dr.Read();
                    {
                        objTemp = new SemestreVO();
                        if (dr["id"] != DBNull.Value)
                           objTemp.Id = (int)dr["id"];

                        if (dr["gradecurr"] != DBNull.Value)
                           objTemp.Gradecurr = (int)dr["gradecurr"];

                        if (dr["sequencia"] != DBNull.Value)
                           objTemp.Sequencia = (int)dr["sequencia"];

                        if (dr["ano"] != DBNull.Value)
                           objTemp.Ano = (int)dr["ano"];

                        if (dr["periodo"] != DBNull.Value)
                           objTemp.Periodo = (int)dr["periodo"];

                        objRetorno = objTemp;
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //LOAD BY FK - Passa um objeto do tipo VO para em casos onde usar chave estrangeira composta ter essas propriedades preenchidas
        public List<SemestreVO> loadByFk(SemestreVO semestre)
        {
            try
            {
                List<SemestreVO> objRetorno = new List<SemestreVO>();
                SemestreVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                if (semestre.Gradecurr != 0)
                    cmd.Parameters.Add(new SqlParameter("@gradecurr", (object)semestre.Gradecurr));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadByFk;

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    dr.Read();
                    {
                        objTemp = new SemestreVO();
                        if (dr["id"] != DBNull.Value)
                           objTemp.Id = (int)dr["id"];

                        if (dr["gradecurr"] != DBNull.Value)
                           objTemp.Gradecurr = (int)dr["gradecurr"];

                        if (dr["sequencia"] != DBNull.Value)
                           objTemp.Sequencia = (int)dr["sequencia"];

                        if (dr["ano"] != DBNull.Value)
                           objTemp.Ano = (int)dr["ano"];

                        if (dr["periodo"] != DBNull.Value)
                           objTemp.Periodo = (int)dr["periodo"];

                        objRetorno.Add(objTemp);
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //DATATABLE LOAD ALL 
        public DataTable dataTableLoadAll()
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadAll;

                conexao.Open();
                SqlDataAdapter dtAdpt = new SqlDataAdapter(cmd);
                DataTable dtTbl = new DataTable("tab_semestre");

                dtAdpt.Fill(dtTbl);
                return dtTbl;

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        /// <summary>
        /// Carrega os semestres do ano e período passados como parâmetro
        /// </summary>
        /// <param name="semestre">Objeto com as informações do filtro. Os campos ano e período devem estar preenhidos</param>
        /// <returns>Lista de semestres que ocorrem no ano e período especificado</returns>
 
        public List<SemestreVO> loadByAnoPeriodo(SemestreVO semestre)
        {
            try
            {
                List<SemestreVO> objRetorno = new List<SemestreVO>();
                SemestreVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadByAnoPeriodo;

                if (semestre.Ano != 0)
                    cmd.Parameters.Add(new SqlParameter("@ano", (object)semestre.Ano));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                if (semestre.Periodo != 0)
                    cmd.Parameters.Add(new SqlParameter("@periodo", (object)semestre.Periodo));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        objTemp = new SemestreVO();
                        if (dr["id"] != DBNull.Value)
                            objTemp.Id = (int)dr["id"];

                        if (dr["gradecurr"] != DBNull.Value)
                            objTemp.Gradecurr = (int)dr["gradecurr"];

                        if (dr["sequencia"] != DBNull.Value)
                            objTemp.Sequencia = (int)dr["sequencia"];

                        if (dr["ano"] != DBNull.Value)
                            objTemp.Ano = (int)dr["ano"];

                        if (dr["periodo"] != DBNull.Value)
                            objTemp.Periodo = (int)dr["periodo"];

                        objRetorno.Add(objTemp);
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        public List<SemestreVO> loadByCurso(PeriodoacademicoVO periodo, CursoVO curso)
        {
            try
            {
                List<SemestreVO> objRetorno = new List<SemestreVO>();
                SemestreVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadByAnoPeriodo;

                if (periodo.Ano != 0)
                    cmd.Parameters.Add(new SqlParameter("@ano", (object)periodo.Ano));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                if (periodo.Periodo != 0)
                    cmd.Parameters.Add(new SqlParameter("@periodo", (object)periodo.Periodo));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");
                if (curso.Id != 0)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)curso.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        objTemp = new SemestreVO();
                        if (dr["id"] != DBNull.Value)
                            objTemp.Id = (int)dr["id"];

                        if (dr["gradecurr"] != DBNull.Value)
                            objTemp.Gradecurr = (int)dr["gradecurr"];

                        if (dr["sequencia"] != DBNull.Value)
                            objTemp.Sequencia = (int)dr["sequencia"];

                        if (dr["ano"] != DBNull.Value)
                            objTemp.Ano = (int)dr["ano"];

                        if (dr["periodo"] != DBNull.Value)
                            objTemp.Periodo = (int)dr["periodo"];

                        objRetorno.Add(objTemp);
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }
    }
}
